﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using QxFramework.Core;
using UnityEngine;

namespace QxFramework.Utilities
{
    /// <summary>
    /// 本地化管理，负责文本信息的提供。
    /// </summary>
    public class Localization : Singleton<Localization>, ISystemModule
    {
        /// <summary>
        /// 文本文件地址。
        /// </summary>
        public readonly string TextFile = "Text/Language";

        /// <summary>
        /// 文本内容字典，键值对
        /// </summary>
        private Dictionary<string, string> _texts;

        /// <summary>
        /// 以嵌套形式列表的文本表格，包含所有不同语言的文本
        /// </summary>
        private List<List<string>> _table;

        /// <summary>
        /// 当前语言
        /// </summary>
        private string _language;

        /// <summary>
        ///  当前语言。
        /// </summary>

        public string Language
        {
            get
            {
                return _language;
            }
        }

        public override void Initialize()
        {
            base.Initialize();
            _table = new List<List<string>>();

            //读取表格
            string csv = ResourceManager.Instance.Load<TextAsset>(TextFile).text;

            //将表格按行分割
            string[] lines = csv.Split(new[] { '\n', '\r' });

            //循环将表格内容加入列表
            for (int i = 0; i < lines.Length; i++)
            {
                string[] strs = lines[i].Split(',');
                _table.Add(new List<string>(strs));
            }

            //默认设置为中文
            SetLanguage("Chinese");
        }

        /// <summary>
        /// 设置语言。
        /// </summary>
        /// <param name="language">语言名称。</param>
        /// <exception cref="System.ArgumentNullException">表格中未找到语言。</exception>
        public void SetLanguage(string language)
        {
            _texts = new Dictionary<string, string>();

            //寻找第一行能够使用的语言
            int index = -1;
            for (int i = 1; i < _table[0].Count; i++)
            {
                if (_table[0][i] == language)
                {
                    index = i;
                    break;
                }
            }
            //没有找到语言，抛出异常
            if (index == -1)
            {
                throw new ArgumentNullException(language);
            }
            else
            {
                //将找到的语言键值对保存
                for (int i = 0; i < _table.Count; i++)
                {
                    if (!string.IsNullOrEmpty(_table[i][0]))
                    {
                        string target = _table[i][index];
                        //其中对\n转义
                        _texts[_table[i][0]] = target.Replace("\\n", "\n"); ;
                    }
                }
            }
            //最后设置语言
            _language = language;
        }

        /// <summary>
        /// 获取文本。
        /// </summary>
        /// <param name="textName">文本名称。</param>
        /// <returns>对应的语言</returns>
        public string GetText(string textName)
        {
            string text = "";
            if (_texts == null || !_texts.TryGetValue(textName, out text))
            {
                //如果找不到对应文本则显示问号
                text = "?";
            }
            return text;
        }

        public void Update(float deltaTime)
        {
        }

        /// <summary>
        /// 当程序退出时
        /// </summary>
        public void Dispose()
        {
            _table.Clear();
            _texts.Clear();
        }

        public void FixedUpdate(float deltaTime)
        {
        }
    }
}